package com.example.linkedlist;

import java.util.Stack;

public class SingleLinkedList {

    public Anime getHeaderNode() {
        return headerNode;
    }

    // 头节点
    private Anime headerNode = new Anime("", 0);

    public void addNode(Anime anime) {
        Anime tempNode = headerNode;
        while (true) {
            if (tempNode.getNext() == null) {
                tempNode.setNext(anime);
                break;
            }
            tempNode = tempNode.getNext();
        }
    }

    public void showNodes() {
        if (headerNode.getNext() != null) {
            Anime tempNode = headerNode.getNext();
            while (true) {
                if (tempNode == null) {
                    break;
                }
                System.out.println(tempNode.toString());
                tempNode = tempNode.getNext();
            }
        }
    }

    // 逆序打印链表
    public static void reversePrint(Anime node) {
        // 链表为空则不打印
        if (node.next == null) {
            return;
        }
        Stack<Anime> stack = new Stack<>();
        while (node.next != null) {
            stack.push(node.next);
            node = node.next;
        }
        while (stack.size() > 0) {
            System.out.println(stack.pop());
        }
    }

    // 反转链表
    public void reverse(Anime node) {
        // 链表为空，或链表只有一个数值，无需反转
        if (node.next == null || node.next.next == null) {
            return;
        }
        Anime curNode = node.next;
        Anime nextNode = null;
        Anime reverseHardNode = new Anime("", 0);
        while (curNode != null) {
            // 保存当前节点的下一个节点，这一步是为了不让旧链表链条断掉
            nextNode = curNode.next;
            // 让当前节点指向新链表的第一个元素（让新节点的下一个节点指向新链表头结点的下一个元素，完成链表数据的链条的建立）
            curNode.next = reverseHardNode.next;
            // 让新链表的头结点指向当前节点
            reverseHardNode.next = curNode;
            // 将要保存的节点后移
            curNode = nextNode;
        }
        node.next = reverseHardNode.next;
    }

}
